package app.model.tree; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import app.model.Product; /** * Class responsible for creating a Binary Search Tree. Each tree item is * represented by a Node instance * * @author Bogdan * @see Node */ @SuppressWarnings("serial") public class BST implements Serializable { public Node root; public BST() { root = null; } public boolean find(Node node) { Node current = root; while (current != null) { if (current.getNodeID() == node.getNodeID()) { return true; } else if (current.getNodeID() > node.getNodeID()) { current = current.getLeft(); } else { current = current.getRight(); } } return false; } public boolean update(int productID, int stock) { Node current = root; while (current != null) { if (current.getNodeID() == productID) { current.updateNode(stock); return true; } else if (current.getNodeID() > productID) { current = current.getLeft(); } else { current = current.getRight(); } } return false; } public boolean delete(Product node) { Node parent = root; Node current = root; boolean isLeftChild = false; while (current.getNodeID() != node.getProductID()) { parent = current; if (current.getNodeID() > node.getProductID()) { isLeftChild = true; current = current.getLeft(); } else { isLeftChild = false; current = current.getRight(); } if (current == null) { return false; } } if (current.getLeft() == null && current.getRight() == null) { if (current == root) { root = null; } if (isLeftChild == true) { parent.setLeft(null); } else { parent.setRight(null); } } else if (current.getRight() == null) { if (current == root) { root = current.getLeft(); } else if (isLeftChild) { parent.setLeft(current.getLeft()); } else { parent.setRight(current.getLeft()); } } else if (current.getLeft() == null) { if (current == root) { root = current.getRight(); } else if (isLeftChild) { parent.setLeft(current.getRight()); } else { parent.setRight(current.getRight()); } } else if (current.getLeft() != null && current.getRight() != null) { Node successor = getSuccessor(current); if (current == root) { root = successor; } else if (isLeftChild) { parent.setLeft(successor); } else { parent.setRight(successor); } successor.setLeft(current.getLeft()); } return true; } public Node getSuccessor(Node deleleNode) { Node successsor = null; Node successsorParent = null; Node current = deleleNode.getRight(); while (current != null) { successsorParent = successsor; successsor = current; current = current.getLeft(); } if (successsor != deleleNode.getRight()) { successsorParent.setLeft(successsor.getLeft()); successsor.setRight(deleleNode.getRight()); } return successsor; } public void insert(Node node) { Node newNode = node; if (root == null) { root = newNode; return; } Node current = root; Node parent = null; while (true) { parent = current; if (node.getNodeID() < current.getNodeID()) { current = current.getLeft(); if (current == null) { parent.setLeft(newNode); return; } } else { current = current.getRight(); if (current == null) { parent.setRight(newNode); return; } } } } public void display(Node root) { if (root != null) { display(root.getLeft()); System.out.print(" " + root.getNodeID()); display(root.getRight()); } } public List<Node> getAllNodes(Node root) { List<Node> result = new ArrayList<>(); if (root != null) { result.addAll(getAllNodes(root.getLeft())); result.add(root); result.addAll(getAllNodes(root.getRight())); } return result; } }